package opf5.entities.repositorios;

import java.util.List;

import opf5.entities.Equipos.EquipoConcreto;
import opf5.entities.calificaciones.CalificacionConcreta;
import opf5.entities.dominio.Calificacion;
import opf5.entities.dominio.Equipo;
import opf5.entities.dominio.Infraccion;
import opf5.entities.dominio.Inscripcion;
import opf5.entities.dominio.Jugador;
import opf5.entities.dominio.Partido;
import opf5.entities.dominio.Propuesta;
import opf5.entities.infracciones.InfraccionConcreta;
import opf5.entities.inscripciones.CondicionDeInscripcion;
import opf5.entities.inscripciones.InscripcionCondicional;
import opf5.entities.inscripciones.InscripcionEstandar;
import opf5.entities.inscripciones.InscripcionSolidaria;
import opf5.entities.jugadores.JugadorConcreto;
import opf5.entities.partidos.PartidoConcreto;
import opf5.entities.propuestas.PropuestaConcreta;
import opf5.utilidades.Fecha;

public class OPF5Factory implements Factory {
	protected static OPF5Factory instance;
	
	public static OPF5Factory getInstance() {
		if (instance == null) {
			instance = new OPF5Factory();
		}
		
		return instance;
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeInscripcion(opf5.entities.dominio.Jugador, java.lang.String)
	 */
	@Override
	public Inscripcion makeInscripcion(Jugador jugador, String tipoInscripcion) {
		if (tipoInscripcion == "Estandar") {
			return new InscripcionEstandar(jugador);
		} else if (tipoInscripcion == "Solidaria") {
			return new InscripcionSolidaria(jugador);
		}
		
		return new InscripcionCondicional(jugador);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeJugador(java.lang.String, java.lang.String, opf5.utilidades.Fecha)
	 */
	@Override
	public Jugador makeJugador(String nombre, String email, Fecha fecha) {
		return new JugadorConcreto(nombre, email, fecha);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makePropuesta(java.lang.String, opf5.entities.dominio.Jugador, opf5.entities.repositorios.RepositorioPropuestas)
	 */
	@Override
	public Propuesta makePropuesta(String nombreJugadaorPropuesto, Jugador jugador) {
		return new PropuestaConcreta(nombreJugadaorPropuesto, jugador);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makePartido(opf5.utilidades.Fecha, java.lang.String)
	 */
	@Override
	public Partido makePartido(Fecha fecha, String lugar) {
		return new PartidoConcreto(fecha, lugar);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeEquipo(java.util.List)
	 */
	@Override
	public Equipo makeEquipo(List<Jugador> equipo) {
		return new EquipoConcreto(equipo);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeInscripcionCondicional(opf5.entities.dominio.Jugador)
	 */
	@Override
	public Inscripcion makeInscripcionCondicional(Jugador jugador) {
		return new InscripcionCondicional(jugador);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeInscripcionEstandar(opf5.entities.dominio.Jugador)
	 */
	@Override
	public Inscripcion makeInscripcionEstandar(Jugador jugador) {
		return new InscripcionEstandar(jugador);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeInscripcionSolidaria(opf5.entities.dominio.Jugador)
	 */
	@Override
	public Inscripcion makeInscripcionSolidaria(Jugador jugador) {
		return new InscripcionSolidaria(jugador);
	}

	/* (non-Javadoc)
	 * @see opf5.entities.repositorios.Factory#makeInfraccion(opf5.utilidades.Fecha, java.lang.String)
	 */
	@Override
	public Infraccion makeInfraccion(Fecha fecha, String motivo) {
		return new InfraccionConcreta(fecha, motivo);
	}

	@Override
	public Calificacion makeCalificacion(Jugador jugadorCalificador,
			Partido partido, int nota, String comentario) {
		return new CalificacionConcreta(jugadorCalificador, partido, nota, comentario);
	}

	@Override
	public Inscripcion makeInscripcionCondicional(Jugador jugador, CondicionDeInscripcion condicion) {
		return new InscripcionCondicional(jugador, condicion);
	}

}
